package com.cykj.page04.test;

import java.lang.reflect.Method;

/**
 * @BelongsProject: HandTomcat
 * @BelongsPackage: com.cykj.page01.test
 * @Author: WWJ
 * @CreateTime: 2025-06-19 13:05
 * @Description: 反射去获取成员方法
 * @Version: 1.0
 */
public class Lesson04 {
    public static void main(String[] args) throws Exception {
        // 1. 获取 Student 类的字节码对象
        // Class.forName 方法根据类名获取 Class 对象，通过反射可以访问该类的各种信息。
        Class<?> cls = Class.forName("com.cykj.page04.test.Student");

        // 2. 创建 Student 类的实例（无参构造）
        // 使用 getDeclaredConstructor().newInstance() 方法通过反射来创建该类的实例
        Student o = (Student) cls.getDeclaredConstructor().newInstance();

        // 3. 获取所有的方法（公有的，包括父类公有的方法）
        // getMethods() 返回当前类及其父类中所有的公有方法
        Method[] methods = cls.getMethods();
        System.out.println("公有方法：");
        for (Method method : methods) {
            System.out.println(method.getName());
        }

        // 4. 获取所有的方法（包括私有的、本类的方法）
        // getDeclaredMethods() 返回当前类所有的方法，包括私有方法（不包括父类方法）
        Method[] declaredMethods = cls.getDeclaredMethods();
        System.out.println("所有方法（包括私有的）：");
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod.getName());
        }

        // 5. 获取名为 showAge 的方法
        // getDeclaredMethod() 方法根据方法名和参数类型获取特定的方法
        // 这里获取了名为 "showAge" 且参数为 int 类型的方法
        Method showAge = cls.getDeclaredMethod("showAge", int.class);

        // 6. 调用 showAge 方法并传入参数
        // invoke 方法用来通过反射调用方法，第一个参数是对象实例，第二个参数是方法参数
        // 这里调用了 showAge 方法，传入 60 作为参数
        Object invoke = showAge.invoke(o, 60);

        // 7. 打印方法返回值
        // 输出 showAge 方法执行后的返回结果
        System.out.println(invoke);
    }
}


